package com.mate.cloud.redisson.service;

import jakarta.annotation.Resource;
import org.redisson.api.*;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.concurrent.TimeUnit;

@Service
public class RedisService {

    @Resource
    private RedissonClient redissonClient;

    // 1. 操作字符串(String)
    public void operateString() {
        // 获取字符串对象
        RBucket<String> bucket = redissonClient.getBucket("name");

        // 设置值
        bucket.set("张三");

        // 设置值并指定过期时间
        bucket.set("李四", 100, TimeUnit.SECONDS);

    }

    public String get() {
        RBucket<String> bucket = redissonClient.getBucket("name");
        // 获取值
        return bucket.get();

    }


    public Boolean isExists(){
        RBucket<String> bucket = redissonClient.getBucket("name");
        // 判断是否存在
        return bucket.isExists();
    }

    public void del() {
        RBucket<String> bucket = redissonClient.getBucket("name");
        //  删除
        bucket.delete();
    }

    // 2. 操作哈希(Hash)
    public void operateHash() {
        // 获取哈希对象
        RMap<String, Object> map = redissonClient.getMap("user");

        // 添加元素
        map.put("id", 1);
        map.put("name", "张三");
        map.put("age", 25);

        // 批量添加
        map.putAll(Map.of("gender", "男", "address", "北京"));

        // 获取元素
        Object name = map.get("name");
        System.out.println("哈希中的name值: " + name);

        // 获取所有键
        Set<String> keys = map.keySet();

        // 获取所有值
        Collection<Object> values = map.values();

        // 获取所有键值对
        Set<Map.Entry<String, Object>> entries = map.entrySet();

        // 删除元素
        map.remove("age");

        // 判断是否存在某个键
        boolean hasKey = map.containsKey("name");
    }

    // 3. 操作列表(List)
    public void operateList() {
        // 获取列表对象
        RList<String> list = redissonClient.getList("fruits");

        // 添加元素
        list.add("苹果");
        list.add("香蕉");

        // 批量添加
        list.addAll(List.of("橙子", "西瓜"));

        // 获取元素
        String firstElement = list.get(0);
        System.out.println("列表第一个元素: " + firstElement);

        // 获取列表长度
        int size = list.size();

        // 移除元素
        list.remove("香蕉");

        // 获取所有元素
        List<String> allElements = list.readAll();
    }

    // 4. 操作集合(Set)
    public void operateSet() {
        // 获取集合对象
        RSet<String> set = redissonClient.getSet("tags");

        // 添加元素
        set.add("Java");
        set.add("Redis");

        // 批量添加
        set.addAll(Set.of("Spring", "MySQL"));

        // 判断是否包含元素
        boolean contains = set.contains("Redis");

        // 获取集合大小
        int size = set.size();

        // 移除元素
        set.remove("MySQL");

        // 获取所有元素
        Set<String> allElements = set.readAll();
    }

    // 5. 操作有序集合(SortedSet)
    public void operateSortedSet() {
        // 获取有序集合对象

        RScoredSortedSet<String> set = redissonClient.getScoredSortedSet("mySortedSet");
        set.add(10, "1");
        set.add(20, "2");
        set.add(30, "3");

        for (String string : set) {
            // iteration through bulk loaded values
        }

        Map<String, Double> newValues = new HashMap<>();
        newValues.put("4", 40D);
        newValues.put("5", 50D);
        newValues.put("6", 60D);
        int newValuesAmount = set.addAll(newValues);

        Double scoreResult = set.addScore("2", 10);
        set.contains("4");
        set.containsAll(Arrays.asList("3", "4", "5"));

        String firstValue = set.first();
        String lastValue = set.last();

        String polledFirst = set.pollFirst();
        String polledLast = set.pollLast();

        // use read method to fetch all objects
        Collection<String> allValues = set.readAll();
    }

    // 6. 操作计数器(AtomicLong)
    public void operateCounter() {
        // 获取计数器对象
        RAtomicLong counter = redissonClient.getAtomicLong("visitCount");

        // 自增1
        counter.incrementAndGet();

        // 自增指定值
        counter.addAndGet(5);

        // 获取当前值
        long value = counter.get();
        System.out.println("当前计数: " + value);

        // 重置为0
        counter.set(0);
    }
}
